package org.example.handler;

import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
import dev.langchain4j.model.chat.response.ChatResponse;
import org.springframework.stereotype.Component;

/**
 * 打字机效果流式响应处理器
 * 实现 StreamingChatResponseHandler 接口，提供打字机效果
 * @author chao1
 */
@Component
public class TypewriterStreamingHandler implements StreamingChatResponseHandler {
    
    private final long delayMs;
    private final boolean showCursor;
    private final String cursorChar;
    private final StringBuilder fullResponse;
    private boolean isTyping = false;
    
    /**
     * 构造函数
     * @param delayMs 打字延迟时间（毫秒）
     * @param showCursor 是否显示光标
     * @param cursorChar 光标字符
     */
    public TypewriterStreamingHandler(long delayMs, boolean showCursor, String cursorChar) {
        this.delayMs = delayMs;
        this.showCursor = showCursor;
        this.cursorChar = cursorChar;
        this.fullResponse = new StringBuilder();
    }
    
    /**
     * 默认构造函数 - 经典打字机效果
     */
    public TypewriterStreamingHandler() {
        this(80, true, "|");
    }
    
    /**
     * 快速打字效果
     */
    public static TypewriterStreamingHandler fast() {
        return new TypewriterStreamingHandler(50, true, "|");
    }
    
    /**
     * 慢速打字效果
     */
    public static TypewriterStreamingHandler slow() {
        return new TypewriterStreamingHandler(200, true, "█");
    }
    
    /**
     * 无光标效果
     */
    public static TypewriterStreamingHandler noCursor() {
        return new TypewriterStreamingHandler(100, false, "");
    }
    
    /**
     * 处理部分响应
     * 当 AI 生成部分内容时调用
     * 
     * @param partialResponse 部分响应内容
     */
    @Override
    public void onPartialResponse(String partialResponse) {
        fullResponse.append(partialResponse);
        isTyping = true;
        
        // 显示光标（如果启用）
        if (showCursor) {
            System.out.print(cursorChar);
            System.out.flush();
        }
        
        // 直接显示字符（因为 StreamingProductService 已经按字符分割）
        System.out.print(partialResponse);
        System.out.flush();
        
        // 注意：不在这里添加延迟，因为 StreamingProductService 已经有延迟了
        // 如果在这里也添加延迟，会导致双重延迟，影响效果
    }
    
    /**
     * 处理完整响应
     * 当 AI 完成响应时调用
     * 
     * @param chatResponse 完整的聊天响应
     */
    @Override
    public void onCompleteResponse(ChatResponse chatResponse) {
        isTyping = false;
        
        // 移除光标
        if (showCursor) {
            System.out.print("\b \b"); // 退格、空格、退格
        }
        
        // 完成提示
        System.out.println("\n\n" + "=".repeat(50));
        System.out.println("🎯 打字机效果完成！");
        System.out.println("📝 完整响应内容：");
        System.out.println(fullResponse.toString());
        System.out.println("=".repeat(50));
    }
    
    /**
     * 处理错误
     * 当发生错误时调用
     * 
     * @param error 错误信息
     */
    @Override
    public void onError(Throwable error) {
        isTyping = false;
        
        // 移除光标
        if (showCursor) {
            System.out.print("\b \b");
        }
        
        System.err.println("\n\n❌ 打字机效果发生错误: " + error.getMessage());
        error.printStackTrace();
    }
    
    /**
     * 获取完整响应
     */
    public String getFullResponse() {
        return fullResponse.toString();
    }
    
    /**
     * 检查是否正在打字
     */
    public boolean isTyping() {
        return isTyping;
    }
}
